import { API_CONFIG, REQUEST_TIMEOUT, DEFAULT_HEADERS } from './config.js'

/**
 * 通用请求方法
 * @param {string} url - 请求地址
 * @param {Object} options - 请求配置
 * @returns {Promise} 返回Promise对象
 */
function request(url, options = {}) {
  return new Promise((resolve, reject) => {
    const { method = 'GET', data = {}, headers = {} } = options
    
    // 合并请求头
    const requestHeaders = {
      ...DEFAULT_HEADERS,
      ...headers
    }
    
    // 添加token到请求头（如果存在）
    const token = uni.getStorageSync('token')
    if (token) {
      requestHeaders.Authorization = `Bearer ${token}`
    }
    
    // 构建完整URL
    const fullUrl = url.startsWith('http') ? url : `${API_CONFIG.BASE_URL}${url}`
    
    uni.request({
      url: fullUrl,
      method: method.toUpperCase(),
      data: method.toUpperCase() === 'GET' ? data : data,
      header: requestHeaders,
      timeout: REQUEST_TIMEOUT,
      success: (res) => {
		if(res.data.code==61){
			uni.removeStorageSync('token')
			location.reload()
			return
		}
        // 处理响应
        if (res.statusCode >= 200 && res.statusCode < 300) {
          resolve(res.data)
        } else {
          // 处理错误状态码
          const error = new Error(res.data?.message || `请求失败: ${res.statusCode}`)
          error.statusCode = res.statusCode
          error.data = res.data
          reject(error)
        }
      },
      fail: (err) => {
        console.error('请求失败:', err)
        // 处理网络错误
        const error = new Error(err.errMsg || '网络请求失败')
        error.originalError = err
        reject(error)
      }
    })
  })
}

/**
 * GET请求
 * @param {string} url - 请求地址
 * @param {Object} params - 请求参数
 * @param {Object} headers - 请求头
 * @returns {Promise} 返回Promise对象
 */
export function get(url, params = {}, headers = {}) {
  return request(url, {
    method: 'GET',
    data: params,
    headers
  })
}

/**
 * POST请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求数据
 * @param {Object} headers - 请求头
 * @returns {Promise} 返回Promise对象
 */
export function post(url, data = {}, headers = {}) {
  return request(url, {
    method: 'POST',
    data,
    headers
  })
}

/**
 * PUT请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求数据
 * @param {Object} headers - 请求头
 * @returns {Promise} 返回Promise对象
 */
export function put(url, data = {}, headers = {}) {
  return request(url, {
    method: 'PUT',
    data,
    headers
  })
}

/**
 * DELETE请求
 * @param {string} url - 请求地址
 * @param {Object} params - 请求参数
 * @param {Object} headers - 请求头
 * @returns {Promise} 返回Promise对象
 */
export function del(url, params = {}, headers = {}) {
  return request(url, {
    method: 'DELETE',
    data: params,
    headers
  })
}

/**
 * 文件上传方法
 * @param {string} filePath - 文件路径
 * @param {string} name - 文件对应的key
 * @param {string} url - 上传接口地址，默认为文件上传接口
 * @param {Object} formData - 额外的表单数据
 * @param {Object} headers - 请求头
 * @returns {Promise} 返回Promise对象
 */
export function uploadFile(filePath, name = 'file', url = '/admin/upload/file', formData = {}, headers = {}) {
  return new Promise((resolve, reject) => {
    const token = uni.getStorageSync('token')
    if (!token) {
      const error = new Error('请先登录')
      reject(error)
      return
    }

    // 合并请求头
    const requestHeaders = {
      'Authorization': `Bearer ${token}`,
      'uploadtype': 'image',
      ...headers
    }

    // 构建完整URL
    const fullUrl = url.startsWith('http') ? url : `${API_CONFIG.BASE_URL}${url}`

    uni.uploadFile({
      url: fullUrl,
      filePath: filePath,
      name: name,
      formData: formData,
      header: requestHeaders,
      success: (res) => {
        if (res.statusCode >= 200 && res.statusCode < 300) {
          try {
            const data = JSON.parse(res.data)
            resolve(data)
          } catch (e) {
            const error = new Error('上传成功但解析响应数据失败')
            error.response = res
            reject(error)
          }
        } else {
          const error = new Error(`上传失败: ${res.statusCode}`)
          error.statusCode = res.statusCode
          reject(error)
        }
      },
      fail: (err) => {
        const error = new Error(err.errMsg || '网络请求失败')
        error.originalError = err
        reject(error)
      }
    })
  })
}

export default {
  get,
  post,
  put,
  delete: del,
  uploadFile
}
